//
//  function_signature.c
//  compilation
//
//  Created by Kevin Le perf on 17/01/12.
//  Copyright (c) 2012 e2co technologie. All rights reserved.
//

#include <stdlib.h>
#include <stdio.h>
#include "function_signature.h"
#include "symbol.h"
/*
 Une fonction est definie avec un :
 type de retour : int ou void
 une signature de variables entre 0 et 32 variables
 un nombre d'arguments
 */
/*struct function_signature{
	struct symbol * _symbols[32];
	int _number;
};*/

void function_free(void * f){
	struct function_signature * f2 = (struct function_signature *)f;
	int i=0;
	for(;i<f2->_number;i++)
		symbol_free(f2->_symbols[i]);
	free(f);
}
/*
 Cree une nouvelle signature de fonction */
void * function_create(){
	int i=0;
	struct function_signature * _new = malloc(sizeof(*_new));
	for(; i<32 ; _new->_symbols[i]=NULL, i++);
	_new->_number = 0;
	return (void *)_new;
}
/*
 le symbole se place en pile : on ajoute toujours le plus a droite vers la gauche
 ajoute un symbole dans la signature de la fonction >> _symbols[32] = symbol */
int function_add_symbol(struct function_signature * f, struct symbol * symbol){
	if(f != NULL){
		if(f->_number < 32){
			f->_symbols[f->_number] = symbol;
			f->_number++;
		}
		return -2;
	}
	return -1;
}

/*
 retourne le nombre d'arguments de la fonction */
int function_get_number_args(struct function_signature * f){
	if(f != NULL){
		return f->_number;
	}
	return -1;
}

/*
 i : l'indice 0-based de l'argument dans la fonction >> _symbols[number-i-1] */
struct symbol * function_get_symbol(struct function_signature * f, int i){
	if(f != NULL){
		return f->_symbols[f->_number-i-1];
	}
	return NULL;
}

void function_print_signature(struct function_signature *f){
	int i=0;
	printf("(");
	for(;i<f->_number; i++){
		if(i > 0)
			printf(", ");
		symbol_print_type(function_get_symbol(f,i));
		printf(" %s", symbol_get_name(function_get_symbol(f,i)));
	}
	printf(")");
}